home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / appletalk / uab.shar / ddpsvcs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-07-12  |  6.8 KB  |  303 lines

  1. static char rcsid[] = "$Author: cck $ $Date: 88/09/14 10:19:13 $";
  2. static char rcsident[] = "$Header: /src/local/mac/cap/etalk/RCS/ddpsvcs.c,v 1.3 88/09/14 10:19:13 cck Rel $";
  3. static char revision[] = "$Revision: 1.3 $";
  4.  
  5. /*
  6.  * ddpsvcs.c - simple ddp router
  7.  *
  8.  * Some ddp services
  9.  *
  10.  * Copyright (c) 1988 by The Trustees of Columbia University 
  11.  *  in the City of New York.
  12.  *
  13.  * Permission is granted to any individual or institution to use,
  14.  * copy, or redistribute this software so long as it is not sold for
  15.  * profit, provided that this notice and the original copyright
  16.  * notices are retained.  Columbia University nor the author make no
  17.  * representations about the suitability of this software for any
  18.  * purpose.  It is provided "as is" without express or implied
  19.  * warranty.
  20.  *
  21.  *
  22.  * Edit History:
  23.  *
  24.  *  September, 1988  CCKim Created
  25.  *
  26. */
  27.  
  28. static char columbia_copyright[] = "Copyright (c) 1988 by The Trustees of \
  29. Columbia University in the City of New York";
  30.  
  31. #include <stdio.h>
  32. #include <sys/types.h>
  33. #include <netat/appletalk.h>
  34. #include <netat/abnbp.h>
  35.  
  36. #include "gw.h"
  37.  
  38. export void ddp_svcs_init();
  39. export void ddp_svcs_start();
  40. private int echo_handler();
  41. private int nbp_handler();
  42. private int nbp_ptrs();
  43. private void nbp_bridge_request_handler();
  44. #ifdef dontdothisrightnow
  45. private void nbp_lookup_handler();
  46. private void nbp_lookup_reply_handler();
  47. export int nbp_lookup();
  48. export int nbp_register();
  49. export int nbp_delete();
  50. export int nbp_tickle();
  51. #endif
  52.  
  53. /*
  54.  * glue
  55.  *
  56. */
  57.  
  58. export void
  59. ddp_svcs_start()
  60. {
  61. }
  62.  
  63. export void
  64. ddp_svcs_init()
  65. {
  66.   ddp_open(echoSkt, echo_handler);
  67.   ddp_open(nbpNIS, nbp_handler);
  68. }
  69.  
  70. /*
  71.  * echo service
  72.  *
  73. */
  74. private boolean
  75. echo_handler(port, ddp, data, datalen)
  76. PORT_T port;
  77. DDP *ddp;
  78. byte *data;
  79. int datalen;
  80. {
  81.   byte e_cmd;            /* echo command */
  82.   DDP rddp;            /* reply ddp header */
  83.  
  84.   if (ddp->type != ddpECHO)    /* dump it */
  85.     return(TRUE);
  86.  
  87.   e_cmd = *data;            /* first byte is command */
  88.   switch (e_cmd) {
  89.   case echoRequest:
  90.     break;
  91.   case echoReply:
  92.     return(FALSE);        /* still needs forwarding */
  93.   }
  94.   *data = echoReply;        /* establish as reply */
  95.   rddp.dstNet = ddp->srcNet;    /* respond to sender */
  96.   rddp.dstNode = ddp->srcNode;
  97.   rddp.dstSkt = ddp->srcSkt;
  98.   rddp.srcSkt = echoSkt;    /* set socket */
  99.   rddp.type = ddpECHO;        /* and type */
  100.   ddp_output(NULL, &rddp, data, datalen);
  101.   return(TRUE);            /* we handled it */
  102. }
  103.  
  104. /*
  105.  * handle incoming nbp packet
  106.  *
  107.  *
  108. */
  109. private boolean
  110. nbp_handler(port, ddp, data, datalen)
  111. PORT_T port;
  112. DDP *ddp;
  113. byte *data;
  114. int datalen;
  115. {
  116.   word control;
  117.  
  118.   if (ddp->type != ddpNBP)    /* dump it */
  119.     return(TRUE);
  120.  
  121.   if (datalen < nbpMinSize)
  122.     return(TRUE);        /* say we handled it! */
  123.   control = *data >> 4;        /* get nbp control part */
  124.   switch (control) {
  125.   case nbpBrRq:            /* bridge request for lookup */
  126.     nbp_bridge_request_handler(port, ddp, data, datalen);
  127.     return(TRUE);
  128.   case nbpLkUp:            /* nbp lookup */
  129.     break;
  130.   case nbpLkUpReply:        /* nbp lookup reply */
  131.     return(FALSE);        /* for now*/
  132.   /* nbp extended codes */
  133.   case nbpRegister:        /* register a name */
  134.   case nbpDelete:        /* delete a name */
  135.   case nbpTickle:        /* let them know socket is alive and well */
  136.     break;
  137.   case nbpStatusReply:        /* status on register/delete */
  138.   case nbpLookAside:        /* Lookup via NIS */
  139.     return(FALSE);        /* for now */
  140.   }
  141.   return(FALSE);        /* for now */
  142. }
  143.  
  144. /*
  145.  * given a pointer to an NBP packet, return pointers to the three
  146.  * elements of the nbp entity.  assumes there is only one there.
  147.  *
  148.  * returns the valid length of nbp packet
  149. */
  150. private int
  151. nbp_ptrs(nbp, obj, typ, zon)
  152. NBP *nbp;
  153. byte **obj;
  154. byte **typ;
  155. byte **zon;
  156. {
  157.   byte *o, *t, *z;
  158.   int ol, tl, zl;
  159.   o = nbp->tuple[0].name;
  160.   ol = *o;
  161.   if (ol >= ENTITYSIZE)
  162.     return(0);
  163.   t = o+ol+1;            /* get ptr to type */
  164.   tl = *t;            /* get type length */
  165.   if (tl >= ENTITYSIZE)
  166.     return(0);
  167.   z = t+tl+1;            /* get ptr to zone */
  168.   zl = *z;
  169.   if (zl >= ENTITYSIZE)
  170.     return(0);
  171.   *obj = o, *typ = t, *zon = z;
  172.   /* add 3 for lengths, add 1 for enum, and addtrblock */
  173.   return(ol+tl+zl+nbpMinSize);
  174. }
  175.  
  176. /*
  177.  * take an nbp packet and handle it if it is a nbp BrRq
  178.  *
  179. */
  180. private void
  181. nbp_bridge_request_handler(port, ddp, data, datalen)
  182. PORT_T port;            /* incoming port */
  183. DDP *ddp;
  184. byte *data;
  185. int datalen;
  186. {
  187.   struct route_entry *re;
  188.   int tuplelen;
  189.   byte *obj, *typ, *zon;    /* pointers to parts of entity name */
  190.   byte *zonep;            /* nbp zone to lookup */
  191.   NBP nbp;
  192.   DDP sddp;
  193.   
  194.   bcopy((caddr_t)data,(caddr_t)&nbp,sizeof(NBP)>datalen?datalen:sizeof(NBP));
  195.   nbp.control = nbpLkUp;
  196.   /* if bad tuplelen, then drop */
  197.   if ((tuplelen = nbp_ptrs(&nbp, &obj, &typ, &zon)) <= 0)
  198.     return;
  199.   /* zone of "=" is invalid */
  200.   if (zon[0] == 1 && zon[1] == nbpEquals)
  201.     return;
  202.   /* 0 length zone or "*" qualifies as this zone */
  203.   if (zon[0] == 0 || (zon[0] == 1 && zon[1] == nbpStar)) {
  204.     int t;
  205.  
  206.     t = zon[0];
  207.     re = route_find(ddp->srcNet == 0 ? PORT_DDPNET(port) : ddp->srcNet);
  208.     if (re == NULL)        /* can't rewrite zone name */
  209.       return;
  210.     if (re->re_zonep == NULL)    /* bad zone? */
  211.       return;
  212.     zonep = re->re_zonep;
  213.     /* copy it in, plenty of space */
  214.     bcopy((caddr_t)zonep, (caddr_t)zon, (int)(1+(*zonep)));
  215.     tuplelen += (*zonep- t); /* fix length */
  216.   } else {
  217.     if ((zonep = zone_find(zon, FALSE)) == NULL)
  218.       return;
  219.   }
  220.   /* fixup and figure out zone */
  221.   sddp = *ddp;
  222.   sddp.checksum = 0;
  223.   sddp.length = htons(tuplelen + ddpSize);
  224.   for (re = route_list_start(); re; re = route_next(re)) {
  225.     if (!re->re_state || re->re_zonep != zonep)
  226.       continue;
  227.     sddp.dstNode = DDP_BROADCAST_NODE;
  228.     sddp.dstNet = re->re_ddp_net;
  229.     log(LOG_LOTS, "nbp lkup net %d.%d for zone %s",
  230.     nkipnetnumber(re->re_ddp_net), nkipsubnetnumber(re->re_ddp_net),
  231.     zonep+1);
  232.     ddp_output(NULL, &sddp, (byte *)&nbp, tuplelen);
  233.   }
  234.   return;
  235. }
  236.  
  237. #ifdef dontdothisrightnow
  238. /*
  239.  * handle an incoming nbp lookup request
  240.  *
  241. */
  242. private void
  243. nbp_lookup_handler(port, ddp, data, datalen)
  244. PORT_T port;
  245. DDP *ddp;
  246. byte *data;
  247. int datalen;
  248. {
  249.   int tuplelen;
  250.   byte *obj, *typ, *zon;
  251.   NPB nbp;
  252.  
  253.   bcopy((caddr_t)data,(caddr_t)&nbp,sizeof(NBP)>datalen?datalen:sizeof(NBP));
  254.   /* if bad tuplelen, then drop */
  255.   if ((tuplelen = nbp_ptrs(&nbp, &obj, &typ, &zon)) <= 0)
  256.     return;
  257.   /* zone specified is not myzone */
  258.   if (!(zon[0] == 0 || (zon[0] == 1 && zon[1] == '*'))) {
  259.     /* check to see if zone specified is same as port's zone */
  260.     byte *zp;
  261.  
  262.     if ((zp = zone_find(zon, FALSE)) == NULL) /* find it */
  263.       return;            /* wasn't there */
  264.     if (zp != port->p_zonep)    /* check the canonical zone name */
  265.       return;            /* bad, return */
  266.   }
  267.   /* check our tables and rspond */
  268.   {
  269.     EntityName *en;
  270.   }
  271. }
  272.  
  273. private void
  274. nbp_lookup_reply_handler()
  275. {
  276. }
  277.  
  278. export int
  279. nbp_lookup()
  280. {
  281. }
  282.  
  283. export int
  284. nbp_register()
  285. {
  286.   /* check by lookup first? */
  287.   /* insert into our tables */
  288. }
  289.  
  290. export int
  291. nbp_delete()
  292. {
  293.   /* delete from our tables */
  294. }
  295.  
  296. export int
  297. nbp_tickle()
  298. {
  299.   /* reset timer */
  300. }
  301.  
  302. #endif /* NOTDONE */
  303.